#include <sys/stat.h>
#include <fcntl.h>
#include "stdio.h"
#include <unistd.h>
#include <sys/mman.h>

int lcdfd;
int *lcdmem;

int red = 0x00ff0000;
int green = 0x0000ff00;
int blue = 0x000000ff;
int yellow = 0x00ffff00;
int white = 0x00ffffff;
int black = 0x00000000;

//lcdmem + x + 800 * y

int main()
{
    lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        perror("open /dev/fb0 error");
    }

    lcdmem =  mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcdfd, 0);
    if(lcdmem == MAP_FAILED)
    {
        perror("mmap error");
    }

    int x,y;
    //刷白
    for(y=0; y<480; y++)
    {
        for(x=0; x<800; x++)
        {
            *(lcdmem+x+800*y) = white;
        }
    }

    int height = 200;         // 三角形的高度
    int base = 200;          // 三角形的底边长
    int start_x = 100;    // 三角形起始x坐标，使其水平居中
    int start_y = 100;  // 三角形起始y坐标，使其垂直居中

    for (y = 0; y < height; y++) {
        int width = base * (y + 1) / height;   // 计算当前行的宽度
        int x_offset = (base - width) / 2;     // 计算当前行的x偏移量
        
        for (x = 0; x < width; x++) {
            lcdmem[start_x + x_offset + x + (start_y + y) * 800] = red;  // 绘制当前像素点
        }
    }

    //绘制正方形
    for(y=0; y<480; y++)
    {
        for(x=0; x<800; x++)
        {
            if(y>=100 && y<300 && x>=400 && x<600)
            {
                *(lcdmem+x+800*y) = black;
            }
        }
    }


    close(lcdfd);
    munmap(lcdmem, 800*480*4);
}